GVariant **out_variant,
GError **error);
+gboolean ostree_repo_load_variant_if_exists (OstreeRepo *self,
+ OstreeObjectType expected_type,
+ const char *sha256,
+ GVariant **out_variant,
+ GError **error);
+
gboolean ostree_repo_load_pack_index (OstreeRepo *self,
const char *pack_checksum,
gboolean is_meta,
{
gboolean ret = FALSE;
int n, i;
- ot_lvariant GVariant *key;
+ ot_lvariant GVariant *key = NULL;
ot_lvariant GVariant *tree = NULL;
ot_lvariant GVariant *files_variant = NULL;
ot_lvariant GVariant *dirs_variant = NULL;
goto out;
}
- if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_DIR_TREE, dirtree_checksum, &tree, error))
+ if (!ostree_repo_load_variant_if_exists (repo, OSTREE_OBJECT_TYPE_DIR_TREE, dirtree_checksum, &tree, error))
goto out;
+ if (!tree)
+ return TRUE;
+
key = ostree_object_name_serialize (dirtree_checksum, OSTREE_OBJECT_TYPE_DIR_TREE);
if (!g_hash_table_lookup (inout_reachable, key))
{
inout_reachable, cancellable, error);
}
+/**
+ * ostree_traverse_commit:
+ *
+ * Add to @inout_reachable all objects reachable from
+ * @commit_checksum, traversing @maxdepth parent commits.
+ */
gboolean
ostree_traverse_commit (OstreeRepo *repo,
const char *commit_checksum,
ot_lvariant GVariant *commit = NULL;
/* PARSE OSTREE_SERIALIZED_COMMIT_VARIANT */
- if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, commit_checksum, &commit, error))
+ if (!ostree_repo_load_variant_if_exists (repo, OSTREE_OBJECT_TYPE_COMMIT, commit_checksum, &commit, error))
goto out;
+
+ /* Just return if the parent isn't found; we do expect most
+ * people to have partial repositories.
+ */
+ if (!commit)
+ break;
key = ostree_object_name_serialize (commit_checksum, OSTREE_OBJECT_TYPE_COMMIT);
g_hash_table_replace (inout_reachable, key, key);